﻿// 846. 树的重心.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>

using namespace std;

/*
https://www.acwing.com/problem/content/848/

给定一颗树，树中包含 n个结点（编号 1∼n）和 n−1条无向边。

请你找到树的重心，并输出将重心删除后，剩余各个连通块中点数的最大值。

重心定义：重心是指树中的一个结点，如果将这个点删除后，剩余各个连通块中点数的最大值最小，那么这个节点被称为树的重心。

输入格式
第一行包含整数 n，表示树的结点数。

接下来 n−1行，每行包含两个整数 a和 b
，表示点 a和点 b之间存在一条边。

输出格式
输出一个整数 m
，表示将重心删除后，剩余各个连通块中点数的最大值。

数据范围
1≤n≤105
输入样例
9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6
输出样例：
4
*/

const int N = 100010, M = 2 * N;
int h[N], e[M], ne[M], idx;
int n; int vis[N];
int ans= 0x3f3f3f3f;

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

int dfs(int x) {
	vis[x] = 1;

	int currMax = 0; int sum = 0;

	for (int i = h[x]; i != -1; i = ne[i]) {
		int j = e[i];
		if (vis[j]) continue;
		int s = dfs(j);
		currMax = max(currMax, s);
		sum += s;
	}
	currMax = max(currMax, n - sum - 1);

	ans = min(ans, currMax);
 
	return sum + 1;
}

int main() {
	memset(h, -1, sizeof h);
	cin >> n;
	for (int i = 1; i < n; i++) {
		int a, b; cin >> a >> b;
		add(a, b); add(b, a);
	}

	dfs(1);

	cout << ans << endl;
	return 0;
}